package com.skiving.cloud.ai.controller;

import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.chat.ChatResponse;
import org.noear.solon.ai.chat.message.AssistantMessage;
import org.noear.solon.annotation.*;
import org.noear.solon.web.sse.SseEvent;
import org.noear.solon.core.util.MimeType;
import reactor.core.publisher.Flux;

import java.io.IOException;

@Slf4j
@Controller
@Api("数据字典接口")
@Mapping("/ai/demo")
public class DemoController {
    @Inject
    ChatModel chatModel;

    /**
     * 一次性返回
     * @param message 消息
     * @return 返回消息
     */
    @Mapping("/hello")
    @Produces(MimeType.APPLICATION_JSON_UTF8_VALUE)
    public String hello(String message) throws IOException {
        AssistantMessage say = chatModel.prompt("你好！").call().getMessage();
        return say.getContent();
    }

    /**
     * 流式响应返回
     * @param message 消息
     * @return 返回消息
     */
    @Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE) //这个很重要，申明用 sse 格式渲染
    @Mapping("helloFlux")
    public Flux<SseEvent> helloFlux(String message) {
        return Flux.from(chatModel.prompt("你好，你是谁啊？").stream())
                .filter(ChatResponse::hasChoices)
                .map(resp -> {
                    log.info(resp.getMessage().getContent());
                    return resp.getMessage();
                })
                .map(msg -> new SseEvent().data(msg.getContent()));
    }

    @Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE) //这个很重要，申明用 sse 格式渲染
    @Mapping("testFlux")
    public Flux<SseEvent> testFlux(String message) {
        return Flux.create(fluxSink -> fluxSink.next("""
                好的，用户发来了一句“你好！”，我需要用中文回应。首先，要友好地回复问候，保持亲切的语气。然后，可能需要询问他们有什么需要帮助的地方，这样可以引导对话继续下去。同时要注意保持自然，避免过于机械化的回答。
                
                接下来，考虑用户可能的意图。他们可能只是打个招呼，或者有具体的问题需要解决。因此，回应应该既热情又开放，鼓励用户进一步说明需求。比如可以问：“有什么我可以帮助你的吗？”这样既回应了问候，又提供了帮助的机会。
                
                还要检查有没有语法错误，确保表达清晰。另外，保持回答简洁，不要太冗长，让用户感觉轻松。如果有需要的话，可以加入一些表情符号，但根据平台和用户的习惯来决定是否合适。不过在这里可能保持正式一点的语气更好，不需要使用表情符号。
                
                最后，确保整个回答符合中文的表达习惯，避免直译英文结构，让用户感受到自然的交流。比如使用“你好！”作为回应，然后询问需求，这样比较符合中文的日常对话方式。</think>
                
                你好！很高兴见到你，有什么我可以帮忙的吗？""")).map(msg -> new SseEvent().data(msg));
    }
}
